/*
 * TDA_SVN.h
 *
 *  Created on: Oct 4, 2013
 *      Author: enano
 */

#ifndef TDA_SVN_H_
#define TDA_SVN_H_

#include "Cola.h"
#include "Lista.h"

#define OK 0
#define ARCH_VERSIONADO 1

/* Posibles argumentos que recibe el programa.*/
#define ADD "-add"
#define REMOVE "-remove"
#define QUERY "-query"
#define COMMIT "-commit"
#define ROLLBACK "-rollback"

/* Posibles errores a evaluar para la stderr. */
#define ERROR -1
#define NO_REVISION -1
#define ERROR2 -2
#define ERR_ABRIR_ARCHIVO -3



typedef enum { TAV_INSE, TAV_ELIM } tipo_cambio_t;

typedef enum { TAV_CREAR, TAV_USAR } modo_uso_t;

typedef struct
{
    char* ruta;
    TListaSimple revisiones;
} TAV;

typedef struct
{
    int num;
    char* comentario;
    char* fecha;
} info_revision_t;

typedef struct
{
    TCola cambios;
    info_revision_t info;
} revision_t;

typedef struct
{
    tipo_cambio_t tipo;
    int pos;
    char* texto;
} cambio_t;



/**
 * Abre un archivo para gestionar su historial de versiones.
 *
 * PRE-CONDICION: 'tav' debe existir en memoria. 'ruta' es la ruta al archivo, alocada y terminada en '\0'.
 *
 * @param: manipulador del archivo que se desea abrir; type: TAV*.
 * @param: ruta al archivo a abrir; type: const char*.
 * @param: modo en que se abrirá el archivo tav; type: modo_uso_t.
 * @return: OK si el archivo está versionado.
 *          ARCH_VERSIONADO si el archivo existe y no esta versionado, versionandolo.
 *          ERROR si hubo algún error.
 */
int TAV_Abrir ( TAV* tav, const char* ruta, modo_uso_t modo);


/**
 * Cierra el archivo 'tav'.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto.
 *
 * @param: manipulador del archivo a cerrar; type: TAV*.
 * @return: OK si tod0 salió bien.
 *          ERROR si ocurrió algún error.
 */
int TAV_Cerrar ( TAV* tav );


/**
 * Quita la funcionalidad de versionado al archivo 'tav'.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto.
 *
 * @param: manipulador del archivo a comprimir; type: TAV*.
 * @return: OK cierra tav y elimina sus estructuras.
 *          ERROR si hubo algún error.
 */
int TAV_Liberar ( TAV* tav );


/**
 * Actualiza el historial a la version actual del archivo.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto.
 *
 * @param: manipulador del archivo a actualizar; type: TAV*.
 * @param: comentario a guardar; type char*.
 * @return: número de revisión actualizado, si tod0 salió bien.
 *          ERROR si hubo algún error.
 */
int TAV_Actualizar ( TAV* tav, char* comentario );


/**
 * Recupera la revisión 'rev' del archivo.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto.
 *
 * @param: manipulador del archivo a actualizar; type: TAV*.
 * @param: número entero mayor que cero; type: int.
 * @param: comentario a guardar; type char*.
 * @return: OK si tod0 salió bien.
 *          NO_REVISION si no existe la revisión.
 *          ERROR2 si ocurrió otro error.
 */
int TAV_Deshacer ( TAV* tav, int rev, char* comentario );


/**
 * Lee el comentario y la fecha de la revisión 'rev' del archivo.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto. 'info' debe existir en memoria.
 *
 * @param: manipulador del archivo a actualizar; type: TAV*.
 * @param: número de revisión que se desea consultar; type: int.
 * @param: estructura donde se guardará la información de la revisión; type: info_revision_t*.
 * @return: OK si tod0 salió bien.
 *          NO_REVISION si no existe revisión 'rev'.
 *          ERROR2 si hubo otro error.
 */
int TAV_GetInfoRevision ( TAV* tav, int rev, info_revision_t* info );


/**
 * Lee el comentario y la fecha de todas las revisiones del archivo.
 *
 * PRE-CONDICION: 'tav' debe existir y estar abierto. 'info' debe existir en memoria y apuntar a una lista simple.
 *
 * @param: manipulador del archivo a actualizar; type: TAV*.
 * @param: lista donde se guardará la información de las revisiones; type: TLista*.
 * @return: OK si tod0 salió bien.
 *          ERROR si hubo algún error.
 */
int TAV_GetListaRevisiones(TAV* tav, TListaSimple* info);



#endif /* TDA_SVN_H_ */
